<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="author" content="wangbo">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数据转化</title>
</head>

<body>
  <script>
    // 转换规则


    // 如果至少有一个操作数是对象，会被转换成原始值（字符串，数字或布尔）；
    // 转换之后，如果至少有一个操作数是字符串类型，第二个操作数会被转换成字符串，并且会执行连接。
    // 在其他的情况下，两个操作数都会转换成数字并执行算数加法运算。
    // 如果两个操作数都是原始类型，运算符会检查是否至少有一个是字符串类型，如果是就执行连接操作。其他情况就都转换为数字并求合。



    // 对象类型转为原始类型

    // 如果对象类型是Date，会调用该对象的toString()；
    // 其他情况下，如果valueOf()返回的是原始类型，会调用对象的valueOf()；
    // 其他情况下（如果valueOf()不存在或没有返回原始类型），会调用toString()方法，大部分情况下是用的这种转换。
    // 当数组转换为原始类型，JavaScript会使用它的join(',')方法，例如[1, 5, 6]就是"1,5,6"。普通JavaScript对像{ }的原始类型是"[object Object]"。

    // ==和!=比较时，优化转换为number类型，其次是string类型，不会主动转化为boolean类型
    // +号运算符操作时，优化转换为string类型，其次是number类型，不会主动转化为boolean类型
    console.log({}.valueOf());

    var ob = {
      toString: function () {
        console.log('call toString');
        return [];
      },
      valueOf: function () {
        console.log('call valueOf');
        return {};
      }
    }
    String(ob)
  </script>
</body>

</html>